home *** CD-ROM | disk | FTP | other *** search
- //
- // Fichero: IMPR.CPP
- //
- // Versi≤n: 1.0
- // Autor: Antonio M. EstΘvez Lorenzo
- // Prop≤sito: Envφa documentos a la impresora
- // Configura la impresora
- //
-
- #include <windows.h>
- #include <owl.h>
- #pragma hdrstop
-
- #include "impr.h"
- #include "strings.h"
- #include <static.h>
-
- static BOOL Abortado= FALSE;
- static BOOL UsarBandInfo;
- static HDC ImprDC;
- static WORD Flags;
- static BOOL Primera;
- static RECT BandRect;
- static SIZE DimPagina;
-
- BOOL FAR PASCAL _export AbortProc(HDC, short)
- {
- MSG Msg;
-
- while(!Abortado && PeekMessage(&Msg, NULL, NULL, NULL, PM_REMOVE))
- {
- TranslateMessage(&Msg);
- DispatchMessage(&Msg);
- }
- return (!Abortado);
- }
-
- static void CreaDriverStr(Pchar DriverStr, int MaxLen,
- Pchar Device, Pchar Port)
- {
- StrCpy(DriverStr, Device);
- LoadString(GetApplicationObject()->hInstance, SR_ON,
- (DriverStr + LongStr(DriverStr)), MaxLen-LongStr(DriverStr)-1);
- StrUne(DriverStr, DriverStr, Port);
- }
-
-
- /* TDatosImpr */
-
- TDatosImpr::TDatosImpr(Pchar dispos, Pchar driver, Pchar puerto, TDatosImpr *Ultimo)
- {
- Dispos= NewStr(dispos);
- Driver= NewStr(driver);
- Puerto= NewStr(puerto);
- Siguiente= NULL;
- if(Ultimo)
- Ultimo->Siguiente= this;
- }
-
- TDatosImpr::~TDatosImpr()
- {
- delete Dispos;
- delete Driver;
- delete Puerto;
- if(Siguiente)
- delete Siguiente;
- }
-
-
- /* TImpresora */
-
- TImpresora::TImpresora(Pchar titulo)
- {
- Titulo= NewStr(titulo);
- Banding= FALSE;
- ForzarTodos= TRUE;
- }
-
- TImpresora::~TImpresora()
- {
- delete Titulo;
- }
-
- BOOL TImpresora::HayMasPaginas()
- {
- return FALSE;
- }
-
-
- /* TImpr */
-
- TImpr::TImpr()
- {
- Dispos= NULL;
- Driver= NULL;
- Puerto= NULL;
- ModuloDispos= NULL;
- ConfigDispos= NULL;
- Error= NULL;
- SelecDispos(NULL, NULL, NULL);
- }
-
- TImpr::~TImpr()
- {
- IniciaDispos();
- }
-
- void TImpr::IniciaDispos()
- {
- delete Dispos;
- delete Driver;
- delete Puerto;
- Dispos= Driver= Puerto= NULL;
-
- if((int)ModuloDispos>= 32)
- {
- FreeLibrary(ModuloDispos);
- ModuloDispos= NULL;
- }
- if(ConfigDispos)
- delete [](Pchar) ConfigDispos;
- Estado= IE_NOASOCIADO;
- }
-
- void TImpr::ImprDefecto()
- {
- char Impr[80];
- char DisposStr[70], DriverStr[70], PuertoStr[10];
-
- GetProfileString("windows", "device", "", Impr,sizeof(Impr)-1);
- SeparaParam(Impr,DisposStr,DriverStr,PuertoStr);
- Dispos= NewStr(DisposStr);
- Driver= NewStr(DriverStr);
- Puerto= NewStr(PuertoStr);
- }
-
- void TImpr::SelecDispos(Pchar dispos, Pchar driver, Pchar puerto)
- {
- char NombreDriver[80];
- DEVMODE ModoDisp;
-
- if(StrEqu(Dispos, dispos) &&
- StrEqu(Driver, driver) &&
- StrEqu(Puerto, puerto))
- return;
- IniciaDispos();
- if(dispos == NULL)
- ImprDefecto();
- else
- {
- Dispos= NewStr(dispos);
- Driver= NewStr(driver);
- Puerto= NewStr(puerto);
- }
- Estado = IE_OK;
- StrUne(NombreDriver, Driver, ".DRV");
- ModuloDispos= LoadLibrary(NombreDriver);
- if((int)ModuloDispos< 32)
- Estado= IE_NOVALIDO;
- else
- {
- ModoDisposExt= (LPFNDEVMODE) GetProcAddress(ModuloDispos, "ExtDeviceMode");
- ModoDispos= (PTModoDispos) GetProcAddress(ModuloDispos, "DeviceMode");
- if((ModoDispos== NULL) && (ModoDispos== NULL))
- Estado= IE_NOVALIDO;
- if(ModoDisposExt!= NULL)
- {
- LongConfig= ModoDisposExt(0, ModuloDispos, &ModoDisp,
- Dispos, Puerto, &ModoDisp, NULL, 0);
- ConfigDispos= (PDEVMODE) new char[LongConfig];
- ModoDisposExt(0, ModuloDispos, ConfigDispos, Dispos, Puerto,
- ConfigDispos, NULL, DM_OUT_BUFFER);
- }
- else
- ConfigDispos= NULL;
- }
- }
-
- void TImpr::Configurar(PTWindowsObject Window)
- {
- if (Estado == IE_OK)
- if(ModoDisposExt== NULL)
- ModoDispos(Window->HWindow, ModuloDispos, Dispos, Puerto);
- else
- ModoDisposExt(Window->HWindow, ModuloDispos, ConfigDispos, Dispos,
- Puerto, ConfigDispos, NULL, DM_IN_BUFFER | DM_PROMPT | DM_OUT_BUFFER);
- }
-
- HDC TImpr::GetDC()
- {
- if(Estado== IE_OK)
- return CreateDC(Driver, Dispos, Puerto, (LPSTR)(LPDEVMODE)ConfigDispos);
- else
- return NULL;
- }
-
- SIZE TImpr::DimPaginaMM()
- {
- SIZE Dim;
-
- HDC Hdc= GetDC();
- Dim.cx = GetDeviceCaps(Hdc, HORZSIZE);
- Dim.cy = GetDeviceCaps(Hdc, VERTSIZE);
- DeleteDC(Hdc);
- return Dim;
- }
-
- SIZE TImpr::DimPaginaPixels()
- {
- SIZE Dim;
-
- HDC Hdc= GetDC();
- Dim.cx = GetDeviceCaps(Hdc, HORZRES);
- Dim.cy = GetDeviceCaps(Hdc, VERTRES);
- DeleteDC(Hdc);
- return Dim;
- }
-
- void TImpr::CalcBandingFlags()
- {
- struct TBandInfo
- {
- BOOL fGraficos;
- BOOL fTexto;
- RECT GrafRect;
- } BandInfo;
-
- WORD pFlags = 0;
- if(UsarBandInfo)
- {
- Escape(ImprDC, BANDINFO, sizeof(TBandInfo), NULL, (LPSTR)&BandInfo);
- if(BandInfo.fGraficos)
- pFlags= IF_GRAFICOS;
- if(BandInfo.fTexto)
- pFlags= pFlags | IF_TEXTO;
- Flags = (Flags & !IF_AMBOS) | pFlags;
- }
- else
- {
- if((Primera) && (BandRect.left== 0) &&
- (BandRect.top== 0) &&
- (BandRect.right== DimPagina.cx) &&
- (BandRect.bottom== DimPagina.cy))
- Flags = IF_TEXTO;
- else if ((Flags & IF_AMBOS) == IF_TEXTO)
- Flags = ((Flags & !IF_AMBOS) | IF_GRAFICOS);
- else
- Flags = Flags | IF_AMBOS;
- }
- Primera= FALSE;
- }
-
- BOOL TImpr::Imprime(PTWindowsObject ParentWin, PTImpresora Impresora)
- {
- typedef BOOL (FAR PASCAL *PTAbortProc)( HDC Prn, short Code );
-
- BOOL Banding;
- WORD NumeroPagina;
- PTAbortProc AbortProcInst;
- PTWindowsObject Dlg;
-
- BOOL result = FALSE;
-
- Error= NULL;
-
- if((!Impresora) || (!ParentWin))
- return result;
- if(Estado!= IE_OK)
- {
- Error = SP_ERROR;
- InformaError(Impresora);
- return result;
- }
-
- ImprDC = GetDC();
- if(!ImprDC)
- return result;
-
- Dlg= GetApplicationObject()->MakeWindow(new TDlgAbortImpr(
- ParentWin, Impresora->Titulo, Dispos, Puerto));
- if(!Dlg)
- {
- DeleteDC(ImprDC);
- return result;
- }
- EnableWindow(ParentWin->HWindow, FALSE);
-
- AbortProcInst= (PTAbortProc) MakeProcInstance((FARPROC)AbortProc,
- GetApplicationObject()->hInstance);
- Escape(ImprDC, SETABORTPROC, 0, LPSTR(AbortProcInst), NULL);
-
- DimPagina= DimPaginaPixels();
-
- Banding= (Impresora->Banding &&
- GetDeviceCaps(ImprDC, RASTERCAPS) & RC_BANDING);
- if(!Banding)
- {
- BandRect.left = 0;
- BandRect.top = 0;
- BandRect.right = DimPagina.cx;
- BandRect.bottom= DimPagina.cy;
- }
- else
- {
- Flags = BANDINFO;
- UsarBandInfo =
- Escape(ImprDC, QUERYESCSUPPORT, sizeof(Flags), (LPSTR)&Flags, NULL);
- }
- Flags= IF_AMBOS;
- Error= Escape(ImprDC, STARTDOC, LongStr(Impresora->Titulo),
- Impresora->Titulo, NULL);
- NumeroPagina= 1;
- if(Error> 0)
- {
- do
- {
- if(Banding)
- {
- Primera= TRUE;
- Error = Escape(ImprDC, NEXTBAND, 0, NULL, (LPSTR) &BandRect);
- }
- do
- {
- (*AbortProcInst)(ImprDC, 0);
- if(Banding)
- {
- CalcBandingFlags();
- if((Impresora->ForzarTodos) &&
- ((Flags & IF_AMBOS)== IF_TEXTO))
- SetPixel(ImprDC, 0, 0, 0);
- }
- if(Error> 0)
- {
- Error= Impresora->ImprimePagina(ImprDC, NumeroPagina,
- DimPagina, &BandRect, Flags);
- if((Error> 0) && Banding)
- Error= Escape(ImprDC, NEXTBAND, 0, NULL, (LPSTR) &BandRect);
- }
- }while ((Error> 0) && (Banding) && (!IsRectEmpty(&BandRect)));
-
- if((Error> 0) && (!Banding))
- Error= Escape(ImprDC, NEWFRAME, 0, NULL, NULL);
- NumeroPagina++;
- }while((Error> 0) && (Impresora->HayMasPaginas()) );
-
- if(Error> 0)
- if(Banding && Abortado)
- Escape(ImprDC, ABORTDOC, 0, NULL, NULL);
- else
- Escape(ImprDC, ENDDOC, 0, NULL, NULL);
- else
- Escape(ImprDC, ABORTDOC, 0, NULL, NULL);
- }
- FreeProcInstance((FARPROC) AbortProcInst);
- EnableWindow(ParentWin->HWindow, TRUE);
- delete Dlg;
- DeleteDC(ImprDC);
-
- if(Error & SP_NOTREPORTED )
- InformaError(Impresora);
- result= (Error> 0) && (!Abortado);
- Abortado= FALSE;
- return result;
- }
-
- void TImpr::InformaError(PTImpresora Impresora)
- {
- WORD ErrorId;
- switch (Error)
- {
- case SP_APPABORT:
- ErrorId = SR_PRNCANCEL;
- break;
- case SP_ERROR:
- ErrorId = SR_GENERROR;
- break;
- case SP_OUTOFDISK:
- ErrorId = SR_OUTOFDISK;
- break;
- case SP_OUTOFMEMORY:
- ErrorId = SR_OUTOFMEMORY;
- break;
- case SP_USERABORT:
- ErrorId = SR_PRNMGRABORT;
- break;
- default:
- ErrorId = -Error;
- }
- Mensaje(NULL, ErrorId, MensError, MB_ICONSTOP | MB_OK, (LPSTR)Impresora->Titulo);
- }
-
-
- /* TDlgConfigImpr */
-
- #define prLongStr 80
- #define DimDispos 1000
-
- TDlgConfigImpr::TDlgConfigImpr(PTWindowsObject parent, int ResID, PTImpr impr)
- :TWindDlg(parent, ResID)
- {
- ListImpr = new TComboBox(this, idCombo, prLongStr);
- Impr= impr;
- DatosImpr= NULL;
- }
-
- void TDlgConfigImpr::SetupWindow()
- {
- TWindDlg::SetupWindow();
-
- Pchar LstDisposStr;
- Pchar StrCur;
- Pchar Dispos;
- char Driver[prLongStr];
- char Puerto[prLongStr];
- char DriverStr[prLongStr];
- char PuertoStr[prLongStr];
- TDatosImpr *Ultimo= NULL;
-
- LstDisposStr= new char[DimDispos];
- tmpDatosImpr= new TDatosImpr(Impr->Dispos, Impr->Driver, Impr->Puerto);
-
- GetProfileString("devices", NULL, "", LstDisposStr, DimDispos);
- Dispos= LstDisposStr;
- while(*Dispos!= '\0')
- {
- GetProfileString("devices", Dispos, "", Driver, sizeof(Driver)-1);
- CreaDriverStr(DriverStr, sizeof(DriverStr)- 1, Dispos, "");
- StrCur= (DriverStr + LongStr(DriverStr));
- StrSep(Driver, Puerto, ',');
- StrSep(Puerto, PuertoStr, ',');
- while(Puerto[0]!= '\0' )
- {
- StrCpy(StrCur, Puerto);
- Ultimo= new TDatosImpr(Dispos, Driver, Puerto, Ultimo);
- if(!DatosImpr)
- DatosImpr= Ultimo;
- ListImpr->AddString(DriverStr);
- StrCpy(Puerto, PuertoStr);
- StrSep(Puerto, PuertoStr, ',');
- }
- Dispos+= (LongStr(Dispos)+1);
- }
- delete LstDisposStr;
- if(*(Impr->Dispos)!= '\0')
- CreaDriverStr(DriverStr, prLongStr, Impr->Dispos, Impr->Puerto);
- else
- DriverStr[0] = '\0';
- ListImpr->SetText(DriverStr);
- }
-
-
- TDlgConfigImpr::~TDlgConfigImpr( void )
- {
- delete DatosImpr;
- delete tmpDatosImpr;
- }
-
- void TDlgConfigImpr::Configurar()
- {
- TDatosImpr *pDatos= DatosImpr;
- int Index= ListImpr->GetSelIndex();
-
- if(Index>= 0)
- {
- for(int i=0; i< Index; i++)
- pDatos= pDatos->Siguiente;
- Impr->SelecDispos(pDatos->Dispos, pDatos->Driver, pDatos->Puerto);
- }
- }
-
- void TDlgConfigImpr::Config(RTMessage)
- {
- Configurar();
- Impr->Configurar(this);
- }
-
- void TDlgConfigImpr::Ok(RTMessage Msg)
- {
- Configurar();
- TWindDlg::Ok(Msg);
- }
-
- void TDlgConfigImpr::Cancel(RTMessage Msg)
- {
- TWindDlg::Cancel(Msg);
- if(tmpDatosImpr->Driver== NULL)
- Impr->IniciaDispos();
- else
- Impr->SelecDispos(tmpDatosImpr->Dispos, tmpDatosImpr->Driver,
- tmpDatosImpr->Puerto);
- }
-
-
- /* TReplaceStatic */
-
- _CLASSDEF(TRepStatic)
- class TRepStatic: public TStatic
- {
- Pchar Text;
- protected:
- void SetupWindow();
- public:
- TRepStatic(PTWindowsObject parent, int resId, Pchar text);
- ~TRepStatic();
- };
-
- TRepStatic::TRepStatic(PTWindowsObject parent, int resID, Pchar text)
- :TStatic(parent, resID, 0)
- {
- Text= NewStr(text);
- }
-
- TRepStatic::~TRepStatic()
- {
- delete Text;
- }
-
- void TRepStatic::SetupWindow()
- {
- char St1[80];
- char St2[80];
-
- TStatic::SetupWindow();
- GetText(St1, sizeof(St1) - 1);
- wsprintf(St2, St1, Text);
- SetText(St2);
- }
-
-
- /* TDlgAbortImpr */
-
- TDlgAbortImpr::TDlgAbortImpr(PTWindowsObject parent, Pchar Titulo,
- Pchar Dispos, Pchar Puerto)
- :TWindDlg(parent, dgAbortImpr)
- {
- new TRepStatic(this, idTitulo, Titulo);
- new TRepStatic(this, idDispos, Dispos);
- new TRepStatic(this, idPuerto, Puerto);
- }
-
- void TDlgAbortImpr::SetupWindow()
- {
- TWindDlg::SetupWindow();
- EnableMenuItem(GetSystemMenu(HWindow, FALSE), SC_CLOSE, MF_GRAYED);
- }
-
- void TDlgAbortImpr::WMCommand(RTMessage)
- {
- Abortado= TRUE;
- }
-